aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)/[username]/generate
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2022-12-21 13:40:25 -0800
committerAdam Soltys <[email protected]>2022-12-21 13:40:25 -0800
commitb026bf21ccf70f182c11a7f7542ce0b695e97469 (patch)
tree922e8c623e7399eb157be1f3f5de8c4b513d58f9 /src/routes/(app)/[username]/generate
parentca1aff53de569bc1fb07d7fe1d247a33b4c23999 (diff)
downloadcoinos-ui-es.tar.gz
coinos-ui-es.zip
generate keypair for users that don't have onees
Diffstat (limited to 'src/routes/(app)/[username]/generate')
-rw-r--r--src/routes/(app)/[username]/generate/+page.svelte61
-rw-r--r--src/routes/(app)/[username]/generate/+server.js8
2 files changed, 69 insertions, 0 deletions
diff --git a/src/routes/(app)/[username]/generate/+page.svelte b/src/routes/(app)/[username]/generate/+page.svelte
new file mode 100644
index 00000000..873e336f
--- /dev/null
+++ b/src/routes/(app)/[username]/generate/+page.svelte
@@ -0,0 +1,61 @@
+<script>
+ import { Buffer } from 'buffer';
+ import { onMount } from 'svelte';
+ import { BIP32Factory } from 'bip32';
+ import { bech32m } from 'bech32';
+ import { generateMnemonic, mnemonicToEntropy, mnemonicToSeedSync } from 'bip39';
+ import * as ecc from 'tiny-secp256k1';
+ import { post } from '$lib/utils';
+ import { goto } from '$app/navigation';
+
+ export let data;
+ let { user } = data;
+
+ const { encode, decode, fromWords, toWords } = bech32m;
+
+ const stretch = async (password, salt) =>
+ crypto.subtle.deriveKey(
+ {
+ name: 'PBKDF2',
+ salt,
+ iterations: 100000,
+ hash: 'SHA-256'
+ },
+ await crypto.subtle.importKey(
+ 'raw',
+ new TextEncoder().encode(password),
+ { name: 'PBKDF2' },
+ false,
+ ['deriveBits', 'deriveKey']
+ ),
+ { name: 'AES-GCM', length: 256 },
+ true,
+ ['encrypt', 'decrypt']
+ );
+
+ let mnemonic, key, password, seed, entropy, cipher, pubkey, salt, child;
+
+ onMount(async () => {
+ let bip32 = await BIP32Factory(ecc);
+ mnemonic = generateMnemonic();
+ seed = mnemonicToSeedSync(mnemonic);
+ entropy = mnemonicToEntropy(mnemonic);
+ key = bip32.fromSeed(seed);
+ child = key.derivePath("m/44'/1237'/0'/0/0");
+ salt = crypto.getRandomValues(new Uint8Array(16));
+
+ let bytes = new Uint8Array(
+ await crypto.subtle.encrypt(
+ { name: 'AES-GCM', iv: new Uint8Array(16) },
+ await stretch(password, salt),
+ Uint8Array.from(Buffer.from(entropy, 'hex'))
+ )
+ );
+
+ user.pubkey = Buffer.from(ecc.xOnlyPointFromPoint(child.publicKey)).toString('hex');
+ user.cipher = encode('encprv', toWords(bytes), 180);
+
+ await post(`/${user.username}/generate`, user);
+ goto(`/${user.username}/dashboard`);
+ });
+</script>
diff --git a/src/routes/(app)/[username]/generate/+server.js b/src/routes/(app)/[username]/generate/+server.js
new file mode 100644
index 00000000..c63ab5a6
--- /dev/null
+++ b/src/routes/(app)/[username]/generate/+server.js
@@ -0,0 +1,8 @@
+import { auth, post } from '$lib/utils';
+import { json } from '@sveltejs/kit';
+
+export async function POST({ cookies, request }) {
+ let body = await request.json();
+ let user = await post(`/user`, body, auth(cookies));
+ return json(user);
+}